直播连麦音频与回声消除
本文梳理「直播连麦时,粉丝听到自己的声音」这一类回音问题的技术原理与解决办法。以 Mac 原生直播(微信视频号直播伴侣 + OBS + 大疆 DJI Mic + 耳机)为落点,先讲清回音从哪来、音频链路怎么走、回声消除(AEC)如何工作,再给出可执行的配置手册与排查清单。
1. 现象与本质
连麦回音的典型表现:粉丝在连麦时,从自己耳机/扬声器里听到了自己刚说的话,且往往带一点延迟(几十到几百毫秒)。这不是粉丝设备的问题,而是主播这一端的音频形成了回环。
回环有两条物理路径,理解它们就理解了全部排查方向:
1.1 声学回音(Acoustic Echo)
粉丝的声音在主播电脑上被扬声器外放出来,声波在空气中传播,又被主播的麦克风拾取,混进主播上行音频里传回粉丝。这条路径靠空气传播,所以:
- 戴耳机(声音不进空气)→ 路径断开。
- 扬声器音量越大、麦克风离音箱越近 → 回音越强。
- 软件层面的 AEC 可以压制它,但需要「参考信号」对齐,效果不保证。
1.2 电气回环(Electrical / Loopback Echo)
声音没有经过空气,在电脑内部就被「原样搬回去」了。常见来源:
- 虚拟声卡回环:BlackHole、Loopback、Soundflower、立体声混音(Stereo Mix)把系统输出(含粉丝声)当成一路输入采集,再混进上行。
- 监听/耳返(Monitoring):软件把采集到的声音再输出一遍,若输出到扬声器或又被采集,就成环。
- 多输出设备:同时输出到耳机与虚拟声卡,虚拟声卡那路又回灌。
电气回环戴耳机也断不掉——因为它根本不走空气。这类问题只能靠「关掉回环采集/监听」来解决。
| 对比项 | 声学回音 | 电气回环 |
|---|---|---|
| 传播介质 | 空气 | 电脑内部音频总线 |
| 断掉的方法 | 戴耳机 | 关闭回环采集 / 监听 |
| AEC 能否处理 | 可以(有条件) | 通常无法,必须改路由 |
| 典型设备 | 扬声器 + 麦克风 | BlackHole / 立体声混音 / 监听开关 |
2. 基础原理:音频管线与延迟
2.1 一条音频的完整旅程
数字音频的本质是「按固定时间间隔对声波采样」。直播连麦的音频要经过一条完整的管线:
| 阶段 | 英文 | 做什么 | Mac 上对应 |
|---|---|---|---|
| 采集 | Capture | 麦克风把声波转成数字采样帧 | CoreAudio / USB Audio 驱动 |
| 处理 | DSP | AEC、降噪、增益、混音 | 微信/直播伴侣/OBS 内置,或虚拟声卡 |
| 编码 | Encode | 压缩为 Opus/AAC 等码流 | 推流 SDK |
| 传输 | Transport | 经网络发往平台服务器 | RTMP / 私有连麦协议 |
| 渲染 | Render | 把收到的音频交声卡播放 | CoreAudio → 耳机/扬声器 |
- 采样率(Sample Rate)
- 每秒采样次数,直播通用 48 kHz。链路中若采样率不一致,会触发重采样,既增加延迟也可能引入杂音。
- 帧(Frame)
- 一次处理的最小音频块,常见 10 ms / 20 ms。AEC 按帧工作,帧越长算法看得越远、但延迟越高。
- CoreAudio
- macOS 的底层音频框架,管理所有物理与虚拟音频设备、采样率与时钟同步。
- 虚拟声卡(Virtual Audio Device)
- 纯软件模拟的音频设备,可把一个应用的输出「变成」另一个应用的输入,是 OBS 抓取系统声音的关键,也是电气回环的常见来源。
2.2 延迟与回声感知
回音之所以「听得出来」,是因为它比原声晚到。总延迟由几部分组成:
- 采集缓冲:音频块攒够一帧才处理。
- DSP 处理:AEC 需要时间窗。
- 编码/解码:Opus 等低延迟编码通常 < 20 ms。
- 网络往返(RTT):连麦的主要延迟来源,几十到几百毫秒。
- Jitter Buffer(抖动缓冲):为抗网络抖动而故意缓冲,是连麦延迟的大头。
一般规律:延迟越大,回音越容易被分辨;当回音延迟小于约 10 ms 时,人耳会把它感知为「房间混响」而非回声。这也是为什么 AEC 必须知道精确延迟——它要靠延迟对齐参考信号才能抵消。
3. 核心算法
3.1 AEC 回声消除(Acoustic Echo Cancellation)
AEC 是解决声学回音的核心算法。它的思想很直观:既然我知道扬声器刚刚播了什么,我就能预测麦克风里混进了什么,然后把它减掉。
参考信号(Reference Signal)
AEC 必须拿到「将要播放的音频」(即下行粉丝声)作为参考,再与麦克风采集到的信号对比,估计出「扬声器→麦克风」这条声学路径的传递函数,从而抵消。参考信号拿不准,AEC 就失效。
自适应滤波(Adaptive Filter)
声学路径会随人走动、房间变化而改变,所以 AEC 用自适应滤波器(如 NLMS)实时估计这条路径的冲激响应,滤波器长度决定了能消除多大延迟范围内的回音。
双讲(Double-Talk)
当主播和粉丝同时说话时,麦克风里既有主播声又有回音,算法很难区分,容易误伤主播声音或残留回音。双讲检测(Double-Talk Detection)会临时冻结滤波器更新,保证主播声音不被削弱。
ERLE 与非线性处理
ERLE(Echo Return Loss Enhancement)衡量 AEC 把回音压掉了多少 dB。线性滤波之后通常还会接一个非线性处理器(NLP / Residual Echo Suppressor)处理残余回音。
- AEC(回声消除)
- 用参考信号抵消麦克风中的扬声器回音。
- AES / AGC(自动增益控制)
- 把音量自动调到合适范围,避免忽大忽小。
- 参考信号(Reference)
- 送给 AEC 的「已播放音频」,是 AEC 生效的前提。
- ERLE
- 回声抑制量,单位 dB,越大越干净。
- 双讲(Double-Talk)
- 双方同时说话的状态,是 AEC 最难的场景。
3.2 NS / AGC / VAD / Jitter Buffer
| 算法 | 全称 | 作用 | 与回音的关系 |
|---|---|---|---|
| NS | Noise Suppression | 抑制稳态背景噪声(风扇、空调) | 不消回音,但能掩盖残余 |
| AGC | Automatic Gain Control | 自动调整音量到目标电平 | 增益过大可能放大回音 |
| VAD | Voice Activity Detection | 判断当前是否有语音 | 辅助 AEC 在静音期更新滤波器 |
| Jitter Buffer | 抖动缓冲 | 平滑网络抖动,抗丢包 | 增加延迟,让回音更明显 |
4. 行为图(系统做什么)
4.1 用例图 — 系统功能全景
4.2 序列图 — 连麦一次音频往返
4.3 活动图 — 回音排查流程
4.4 状态机图 — 音频流生命周期
5. 结构图(系统由什么组成)
5.1 数据流图 — 回音的两条路径
5.2 部署图 — Mac 音频部署拓扑
5.3 组件图 — 音频子系统
5.4 类图 — 音频对象模型
6. 场景机理对照
把前面的原理落到具体场景,就能解释「为什么别人可以、我不可以」。
| 场景 | 为什么能/不能消回音 | 结论 |
|---|---|---|
| 手机连麦,不戴耳机 | 系统级免提 AEC,参考信号精确、延迟稳定、麦克风与扬声器固定 | 可以,几乎无回音 |
| Mac 桌面 + 内置麦 + 外放 | 桌面 AEC 弱,但参考信号来自同一系统,若关闭监听/回环,勉强可用 | 有条件可以,音量要小 |
| Mac 桌面 + 外接麦(DJI Mic)+ 外放 | 外接麦经过 USB 与独立增益,AEC 参考与实际回音路径对不齐,且麦克风在空气中直接拾取扬声器声 | 容易回音,必须戴耳机 |
| 带硬件 AEC 的会议麦/USB 音箱 | 设备内置 DSP 做回声消除,不依赖主机软件 | 可以,但设备成本高 |
| 用虚拟声卡抓系统声 + 监听 | 系统输出被当作输入再采一遍,电气回环 | 必然回音,必须改路由 |
| 看似没戴耳机的主播 | 多半戴了隐藏式耳返(IEM),或用了带 DSP 的设备,或其实在手机上播 | 不是真的「无耳机」 |
7. 实战操作手册(Mac 原生)
目标架构:视频走 OBS 虚拟摄像头 → 直播伴侣;音频只保留一条链路,粉丝声只进耳机。两种音频架构二选一,绝不能两边同时采麦克风。
7.1 方案 A:音频统一走 OBS(适合需要 OBS 混音/滤镜)
- 安装虚拟声卡:安装 BlackHole 2ch(免费)。
- 创建多输出设备:打开 macOS「音频 MIDI 设置」→ 左下「+」→「创建多输出设备」→ 勾选耳机与 BlackHole 2ch;把系统输出切到这个多输出设备。这样你听得见,同时系统声也进 BlackHole 给 OBS。
- OBS 添加音源:
- 「音频输入采集」→ 设备选大疆 Mic(主播声)。
- 「音频输入采集」→ 设备选 BlackHole 2ch(系统/粉丝声)。
- 关闭监听:对每个音源点齿轮 →「高级音频属性」→ 把「音频监视」设为关闭(最多设为「仅监视(输出静音)」)。绝不选「监视并输出」。
- 统一采样率:OBS → 设置 → 音频,采样率设为 48 kHz;BlackHole 在「音频 MIDI 设置」里也设为 48 kHz。
- OBS 监视设备:OBS → 设置 → 音频 → 监视设备选耳机。
- 直播伴侣:关闭它自身的麦克风与系统声音采集;麦克风输入选 BlackHole 2ch(接收 OBS 混好的音频)。
7.2 方案 B:OBS 只传画面,音频交给直播伴侣(更简单、更不易回音)
- OBS:只放画面源,不添加任何音频源、不做音频混合;点「启动虚拟摄像头」。
- 直播伴侣:视频源选 OBS Virtual Camera;麦克风选大疆 Mic;关闭系统声音采集;如有「回声消除」选项则打开。
- macOS 声音设置:输出选耳机(不要选扬声器,也不要选 BlackHole/多输出设备)。
- 关闭直播伴侣的监听/耳返。
7.3 大疆 DJI Mic 的注意事项
- DJI Mic 接收器的 3.5mm 监听口只能监听你自己的麦克风,不含粉丝连麦声,插它不能解决连麦回音。
- 接收器以 USB Audio 设备接入 Mac,若同时开了接收器本地监听,注意别把监听声再灌回采集。
- 连麦时务必让「粉丝声」走系统输出到耳机,而不是指望 DJI Mic 去处理它。
7.4 戴耳机的正确接法
「戴耳机」不只是插上耳机,而是所有会发声的路径都指向耳机:
- macOS 系统输出 → 耳机
- 直播伴侣的连麦监听输出 → 耳机
- OBS 的音频监视 → 耳机或关闭
- 大疆 Mic 接收器监听口 → 如需监听自己可插耳机
8. 参数速查手册
8.1 OBS 关键设置
| 位置 | 项 | 推荐值 |
|---|---|---|
| 设置 → 音频 | 采样率 | 48 kHz |
| 设置 → 音频 | 监视设备 | 耳机 |
| 音源 → 高级音频属性 | 音频监视 | 关闭 / 仅监视(输出静音) |
| 音源 → 高级音频属性 | 轨道 | 只勾推流需要的轨道 |
| 输出 → 推流 | 音频比特率 | 128–160 kbps |
8.2 macOS 音频 MIDI 设置
| 对象 | 用途 | 要点 |
|---|---|---|
| 多输出设备 | 同时输出到耳机 + BlackHole | 勾选「漂移校正」,主设备选耳机 |
| 聚合设备 | 合并多个输入 | 时钟源选稳定的物理设备 |
| BlackHole 2ch | 虚拟声卡 | 采样率与 OBS 一致(48 kHz) |
8.3 常见回音源速查
| 回音源 | 检查项 | 处理 |
|---|---|---|
| 声学回音 | 是否外放 | 戴耳机 / 调小音量 / 麦远离音箱 |
| 监听/耳返 | OBS、直播伴侣的监听开关 | 关闭监听 |
| 虚拟声卡回环 | 输入里是否有 BlackHole/立体声混音 | 取消回环采集,只留物理麦 |
| 多输出设备回灌 | 输出是否同时指向虚拟声卡 | 输出只留耳机 |
| 采样率不一致 | OBS / 系统 / BlackHole | 统一 48 kHz |
| 平台侧 AEC | 直播伴侣回声消除开关 | 打开 |
9. 排查决策树与清单
9.1 三步定位
- 戴耳机后是否还有回音?
- 消失 → 是声学回音,保持耳机即可。
- 仍有 → 进入第 2 步。
- 关掉所有监听、移除虚拟声卡回环后是否还有?
- 消失 → 是电气回环,按方案 A/B 重排路由。
- 仍有 → 进入第 3 步。
- 换内置麦 + 关系统声采集是否还有?
- 消失 → 是外接麦 + AEC 参考失配,改用内置麦或硬件 AEC 设备。
- 仍有 → 平台侧问题,联系平台/更换连麦方案。
9.2 上线前检查清单
- ☐ 系统输出已设为耳机(不是扬声器)
- ☐ 直播伴侣监听/耳返已关闭
- ☐ OBS 所有音源的「音频监视」已关闭或设为仅监视输出静音
- ☐ 没有把 BlackHole/立体声混音当作麦克风输入(除非方案 A 明确需要)
- ☐ 麦克风只有一路在采(OBS 与直播伴侣不要同时采)
- ☐ 全链路采样率统一 48 kHz
- ☐ 直播伴侣「回声消除」已打开
- ☐ 扬声器音量(若必须外放)尽量小、麦克风远离音箱